//package com.ly.mpayment.core.util;
//
//import org.apache.commons.net.ftp.FTPClient;
//import org.apache.commons.net.ftp.FTPReply;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.IOException;
//
//public class FTPUtil {
//    /**
//     * 连接 FTP 服务器
//     *
//     * @param addr     FTP 服务器 IP 地址
//     * @param port     FTP 服务器端口号
//     * @param username 登录用户名
//     * @param password 登录密码
//     * @return
//     * @throws Exception
//     */
//    public static FTPClient connectFtpServer(String addr, int port, String username, String password, String controlEncoding) {
//        FTPClient ftpClient = new FTPClient();
//        try {
//            /**设置文件传输的编码*/
//            ftpClient.setControlEncoding(controlEncoding);
//
//            /**连接 FTP 服务器
//             * 如果连接失败，则此时抛出异常，如ftp服务器服务关闭时，抛出异常：
//             * java.net.ConnectException: Connection refused: connect*/
//            ftpClient.connect(addr, port);
//            /**登录 FTP 服务器
//             * 1）如果传入的账号为空，则使用匿名登录，此时账号使用 "Anonymous"，密码为空即可*/
//            if (StringUtils.isBlank(username)) {
//                ftpClient.login("Anonymous", "");
//            } else {
//                ftpClient.login(username, password);
//            }
//
//            /** 设置传输的文件类型
//             * BINARY_FILE_TYPE：二进制文件类型
//             * ASCII_FILE_TYPE：ASCII传输方式，这是默认的方式
//             * ....
//             */
//            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//
//            /**
//             * 确认应答状态码是否正确完成响应
//             * 凡是 2开头的 isPositiveCompletion 都会返回 true，因为它底层判断是：
//             * return (reply >= 200 && reply < 300);
//             */
//            int reply = ftpClient.getReplyCode();
//            if (!FTPReply.isPositiveCompletion(reply)) {
//                /**
//                 * 如果 FTP 服务器响应错误 中断传输、断开连接
//                 * abort：中断文件正在进行的文件传输，成功时返回 true,否则返回 false
//                 * disconnect：断开与服务器的连接，并恢复默认参数值
//                 */
//                ftpClient.abort();
//                ftpClient.disconnect();
//            } else {
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//            System.out.println(">>>>>FTP服务器连接登录失败，请检查连接参数是否正确，或者网络是否通畅*********");
//        }
//        return ftpClient;
//    }
//
//    /**
//     * 使用完毕，应该及时关闭连接
//     * 终止 ftp 传输
//     * 断开 ftp 连接
//     *
//     * @param ftpClient
//     * @return
//     */
//    public static FTPClient closeFTPConnect(FTPClient ftpClient) {
//        try {
//            if (ftpClient != null && ftpClient.isConnected()) {
//                ftpClient.abort();
//                ftpClient.disconnect();
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return ftpClient;
//    }
//
//    public static void main(String[] args) throws Exception {
//        System.out.println("-----------------------应用启动------------------------");
//        FTPClient ftpClient = FTPUtil.connectFtpServer("192.168.1.20", 21, "ftpChina", "ftpChina123456", "gbk");
//        System.out.println("FTP 连接是否成功：" + ftpClient.isConnected());
//        System.out.println("FTP 连接是否有效：" + ftpClient.isAvailable());
//        closeFTPConnect(ftpClient);
//        System.out.println("-----------------------应用关闭------------------------");
//    }
//
//    /**
//     * 上传本地文件 或 目录 至 FTP 服务器----保持 FTP 服务器与本地 文件目录结构一致
//     *
//     * @param ftpClient  连接成功有效的 FTPClinet
//     * @param uploadFile 待上传的文件 或 文件夹(此时会遍历逐个上传)
//     * @throws Exception
//     */
//    public static void uploadFiles(FTPClient ftpClient, File uploadFile) {
//        /**如果 FTP 连接已经关闭，或者连接无效，则直接返回*/
//        if (!ftpClient.isConnected() || !ftpClient.isAvailable()) {
//            System.out.println(">>>>>FTP服务器连接已经关闭或者连接无效*****放弃文件上传****");
//            return;
//        }
//        if (uploadFile == null || !uploadFile.exists()) {
//            System.out.println(">>>>>待上传文件为空或者文件不存在*****放弃文件上传****");
//            return;
//        }
//        try {
//            if (uploadFile.isDirectory()) {
//                /**如果被上传的是目录时
//                 * makeDirectory：在 FTP 上创建目录(方法执行完，服务器就会创建好目录，如果目录本身已经存在，则不会再创建)
//                 * 1）可以是相对路径，即不以"/"开头，相对的是 FTPClient 当前的工作路径，如 "video"、"视频" 等，会在当前工作目录进行新建目录
//                 * 2）可以是绝对路径，即以"/"开头，与 FTPCLient 当前工作目录无关，如 "/images"、"/images/2018"
//                 * 3）注意多级目录时，必须确保父目录存在，否则创建失败，
//                 *      如 "video/201808"、"/images/2018" ，如果 父目录 video与images不存在，则创建失败
//                 * */
//                ftpClient.makeDirectory(uploadFile.getName());
//                /**变更 FTPClient 工作目录到新目录
//                 * 1)不以"/"开头表示相对路径，新目录以当前工作目录为基准，即当前工作目录下不存在此新目录时，变更失败
//                 * 2)参数必须是目录，当是文件时改变路径无效*/
//                ftpClient.changeWorkingDirectory(uploadFile.getName());
//
//                File[] listFiles = uploadFile.listFiles();
//                for (int i = 0; i < listFiles.length; i++) {
//                    File loopFile = listFiles[i];
//                    if (loopFile.isDirectory()) {
//                        /**如果有子目录，则迭代调用方法进行上传*/
//                        uploadFiles(ftpClient, loopFile);
//                        /**changeToParentDirectory：将 FTPClient 工作目录移到上一层
//                         * 这一步细节很关键，子目录上传完成后，必须将工作目录返回上一层，否则容易导致文件上传后，目录不一致
//                         * */
//                        ftpClient.changeToParentDirectory();
//                    } else {
//                        /**如果目录中全是文件，则直接上传*/
//                        FileInputStream input = new FileInputStream(loopFile);
//                        ftpClient.storeFile(loopFile.getName(), input);
//                        input.close();
//                        System.out.println(">>>>>文件上传成功****" + loopFile.getPath());
//                    }
//                }
//            } else {
//                /**如果被上传的是文件时*/
//                FileInputStream input = new FileInputStream(uploadFile);
//                /** storeFile:将本地文件上传到服务器
//                 * 1）如果服务器已经存在此文件，则不会重新覆盖,即不会再重新上传
//                 * 2）如果当前连接FTP服务器的用户没有写入的权限，则不会上传成功，但是也不会报错抛异常
//                 * */
//                ftpClient.storeFile(uploadFile.getName(), input);
//                input.close();
//                System.out.println(">>>>>文件上传成功****" + uploadFile.getPath());
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//}
